package array;

/*
* 创建一个类 public class Array{}，构造函数接收 0 到多个参数
  •  当 new Array()
  ◦  当 new Array() 不传参，可以得到一个长度为 0 的对象数组： [ ]
  ◦  当 new Array() 传入参数，例如 new Array(“zhangsan”, ”lisi”) 就会得到一个长度为 2 的对象数组： [“zhangsan”、”lisi”]
  ◦  当 new Array(实参传入 n 个)，就会得到一个长度为 n 的对象数组
  •    
  •  Array 类重写 toString() ，当打印该实例，能看见数组中所有元素 [“zhangsan”, ”lisi”]
  •  Array 类拥有 push 方法，接收 1 个参数
  ◦  实参自动往数组最后放置
  ◦  当实例调用 push(“heihei”) 会得到长度为 3 的对象数组，包含 “zhangsan”、“lisi”、“heihei”
  •    
  •  Array 类拥有 remove 方法，接收 1 个下标参数，返回 boolean
  ◦  删除该下标的元素，当实例调用 remove(1)，就会得到 “zhangsan”、“heihei”
  ◦  删除成功返回 true 失败返回 false
* */
public class Array {
    public int length;
    public Object[] arr = new Object[0];

    // 无参构造
    public Array() {

    }

    // 带参构造
    public Array(Object... rest) {
        this.arr = rest;
        this.length = rest.length;
    }


    // 重写 toString
    public String toString() {
        if (this.arr.length == 0) { // new Array()
            return "[]";
        } else { // new Array(X,X)
            String str = "[";
            for (int i = 0; i < this.arr.length; i++) {
                str += this.arr[i];
                if (i < this.arr.length - 1) {
                    str += ", ";
                }
            }
            str += "]";
            return str;
        }
    }

    // push
    public void push(String value) {
        int len = this.length + 1;
        Object[] newArr = new Object[len];
        for (int i = 0; i < len; i++) {
            if (i < this.arr.length) {
                newArr[i] = this.arr[i];
            } else {
                newArr[i] = value;
            }
        }
        this.arr = newArr;
        this.length = this.arr.length;
    }

    // remove
    public boolean remove(int index) {
        if (index < 0 || index >= this.arr.length) { // 无效下标
            return false;
        }
        // 有效下标
        int len = this.arr.length - 1;
        Object[] newArr = new Object[len];
        int a = 0;
        for (int i = 0; i < this.arr.length; i++) {
            if (i == index) { // 该下标
                continue;
            }
            newArr[a] = this.arr[i];
            a++;
        }
        this.arr = newArr;
        return true;

    }
}
